package com.aya.transaction;

import com.aya.transaction.service.BlogMandatoryTransactionService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

/**
 * 事物S下面有事物A和事物B
 * 事物A 为 REQUIRED
 * 事物B 为 MANDATORY
 * 那么事物B强制规定调用者S必须有事物的。
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringTransaction.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MandatoryTransaction {

    @Resource
    BlogMandatoryTransactionService blogMandatoryTransactionService;

    /**
     * 事物S 有事物
     * 事物A有事物 REQUIRED
     * 事物B有实物 MANDATORY
     * 正常执行并提交
     */
    @Test
    public void testSuccess() {
        blogMandatoryTransactionService.updateByIdSuccess("1", "transaction success","2","success");
    }

    /**
     * 事物S 有事物
     * 事物A有事物 REQUIRED
     * 事物B有事物 MANDATORY  ,内部抛出异常，回滚整个事物S
     */
    @Test
    public void testFailure() {
        blogMandatoryTransactionService.updateByIdSupportFailure("1", "transaction success","2","not support failure");
    }

    /**
     * 事物S 有事物
     * 事物A有事物 REQUIRED
     * 事物B有事物 MANDATORY  ,事物S 捕获 事物B 内部抛出的异常，回滚整个事物S
     * 如果之后还有事物S包含事物C，那么事物C会执行，但是不会提交
     */
    @Test
    public void testCatchFailure() {
        blogMandatoryTransactionService.updateByIdCatchFailure("1", "transaction success","2","not support failure");
    }

    /**
     * S没有事物
     * 事物A 有事物   执行成功
     * 事物B MANDATORY ,检测到S没有事物,不执行事物B的内容直接抛出异常
     */
    @Test
    public void testNotTransactionSuccess() {
        blogMandatoryTransactionService.updateByIdSuccessNotTransaction("1", "transaction success","2","success");
    }
    /**
     * S没有事物
     * 事物A 有事物  执行成功
     * 事物B MANDATORY ,检测到S没有事物,不执行事物B的内容直接抛出异常
     */
    @Test
    public void testNotTransactionFailure() {
        blogMandatoryTransactionService.updateByIdSupportFailureNotTransaction("1", "transaction failure","2","failure");
    }
}
